package com.relax.CyclicBarrier;
 
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
 
/**
 * 
 *
 * CyclicBarrier
 * 的字面意思是可循环（Cyclic）使用的屏障（Barrier）。它要做的事情是，
 * 让一组线程到达一个屏障（也可以叫同步点）时被阻塞，
 * 直到最后一个线程到达屏障时，屏障才会开门，所有
 * 被屏障拦截的线程才会继续干活。
 * 线程进入屏障通过CyclicBarrier的await()方法。
 * 
 * 现实生活中我们经常会遇到这样的情景，
 * 在进行某个活动前需要等待人全部都齐了才开始。
 * 例如吃饭时要等全家人都上座了才动筷子，
 * 旅游时要等全部人都到齐了才出发，
 * 比赛时要等运动员都上场后才开始。
 */
public class CyclicBarrierDemo
{
  private static final int NUMBER = 2;
  
  public static void main(String[] args) throws InterruptedException {
     //CyclicBarrier(int parties, Runnable barrierAction) 
     
     CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{runGun();}) ;

      new Thread(() -> {
          try {
              System.out.println("线程"+Thread.currentThread().getName()+"\t 运动员到位 ");
              cyclicBarrier.await();
              System.out.println("线程"+Thread.currentThread().getName()+"\t 运动员开始跑步=====================");
          } catch (InterruptedException | BrokenBarrierException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }

      }, String.valueOf(1)).start();


      Thread.sleep(15000);

      new Thread(() -> {
          try {
              System.out.println("线程"+Thread.currentThread().getName()+"\t 运动员到位 ");
              cyclicBarrier.await();
              System.out.println("线程"+Thread.currentThread().getName()+"\t 运动员开始跑步=====================");
          } catch (InterruptedException | BrokenBarrierException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }

      }, String.valueOf(2)).start();
     
 
  }

    private static void runGun() {
        System.out.println("线程"+Thread.currentThread().getName()+"**********人员到位,发令枪响起**********");
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
